Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat [#67] 소식 탭 뉴스 뷰 구현 #72

Open
wants to merge 7 commits into
base: develop
Choose a base branch
from
Open

Conversation

JinUng41
Copy link
Collaborator

👻 PULL REQUEST

🛠️ PR POINT

  • 소식 탭의 뉴스 뷰를 구현하였습니다.

📍 시간 형식 변경을 위한 Formatter 객체

  • 뷰에서 표현되는 시간 형식을 위해 기존의 시간을 다른 형식으로 바꾸는 작업이 필요했습니다.
  • DTO의 extension으로 형식을 바꾸는 메서드를 정의할 경우, dateFormatter가 배열을 순회하면서 생성되고 쓰이고 사라지고를 반복하는데요.
  • 이를 Formatter 객체를 선언하고, dateFormatter는 한 번만 생성되도록 하였습니다.
NewsTimeFormatter 코드
import Foundation

struct NewsTimeFormatter {
    private let dateFormatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.timeZone = TimeZone.current
        return formatter
    }()
    
    func formattedNews(news: [NewsDTO]) -> [NewsDTO] {
        return news.map { formattedNews(news: $0) }
    }
    
    func formattedNews(news: NewsDTO) -> NewsDTO {
        return NewsDTO(
            id: news.id,
            title: news.title,
            text: news.text,
            imageURLString: news.imageURLString,
            time: timeElapsedString(from: news.time)
        )
    }
    
    private func timeElapsedString(from time: String) -> String {
        guard let postDate = dateFormatter.date(from: time) else {
            return "time"
        }
        
        let now = Date()
        let calendar = Calendar.current
        
        let components = calendar.dateComponents(
            [.minute, .hour, .day, .weekOfMonth, .month, .year],
            from: postDate,
            to: now
        )
        
        if let years = components.year, years > 0 {
            return "\(years)년 전"
        } else if let months = components.month, months > 0 {
            return "\(months)달 전"
        } else if let weeks = components.weekOfMonth, weeks > 0 {
            return "\(weeks)주 전"
        } else if let days = components.day, days > 0 {
            return "\(days)일 전"
        } else if let hours = components.hour, hours > 0 {
            return "\(hours)시간 전"
        } else if let minutes = components.minute, minutes > 0 {
            return "\(minutes)분 전"
        } else {
            return "지금"
        }
    }
}
// 뷰모델에서 사용 시
let news = newsSubject
    .map { NewsTimeFormatter().formattedNews(news: $0) }
    .eraseToAnyPublisher()

let selectedNews = input.collectionViewDidSelect
    .filter { $0 < newsSubject.value.count }
    .map { newsSubject.value[$0] }
    .map { NewsTimeFormatter().formattedNews(news: $0) }
    .eraseToAnyPublisher()

💡 참고사항

배지는 스프린트 내에 할 수 있을지 잘 모르겠네요.. 하하하.. ㅠ

📸 스크린샷

기능 스크린샷
뉴스 조회
페이지네이션
새로고침
상세보기

📟 관련 이슈

- 배너 이미지 추가
- 루트 뷰 구현
- 서버에서 내려주는 고유한 id 값만을 비교군으로 삼도록 수정
- 모든 내용이 스크롤 될 수 있도록 함.
- 배지를 제외한 뉴스 조회 / 페이지네이션 / 새로고침 / 상세보기 구현
Copy link
Collaborator

@binisnil binisnil left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드를 볼 수록 느끼는거지만 언어 활용 능력치가 굉장하신 것 같아요!
많이 보고 배우겠습니다 🙇🏻‍♀️🙇🏻‍♀️
고생 많으셨어요!!

input.collectionViewDidEndDrag
.compactMap { newsSubject.value.last?.id }
.filter { [weak self] lastNewsID in
newsSubject.value.count % 15 == 0 &&
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

페이징 로직..! 깔끔하고 더 보기 좋네요,, 페이징로직 수정할 때 참고해서 진행하겠습니다!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Feat] 소식 탭 뉴스 뷰 구현
2 participants